package com.drollo77.idespensa;

import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;

import org.json.JSONException;
import org.json.JSONObject;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.Secure;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class NuevoTipoProducto extends Activity {
	
	private DespensaDbAdapter mDbHelper;
	private WebServiceComms webservice;
	private EditText nombreNuevoTipoProducto;
	private Long mRowId;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	Log.d("nuevo tipo producto","Entra en nuevo tipo producto");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nuevo_tipo_producto);
        Log.d("nuevo tipo producto","Cargado layout");
        // Inicializar la base de datos
        mDbHelper = new DespensaDbAdapter(this);
        mDbHelper.open();
        
        //Inicializar el webservice para actualizar los nuevos tipos de productos
        webservice = new WebServiceComms(this);
        Log.d("nuevo tipo producto","Cargado BBDD");
        // Inicializar las variables donde se guardaran los valores del UI  
        nombreNuevoTipoProducto = (EditText)findViewById(R.id.campoNombreTipoProducto);
        Log.d("nuevo tipo producto","Inicializados controles");
        
        mRowId = null;
    }

    @Override
	protected void onPause() {
		super.onPause();
		mDbHelper.close();
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		mDbHelper.open();
	}
	
	protected class WebServiceComms extends AsyncTask<String, Integer, String>{
    	
    	private Context mCtx;
    	private String result;
    	private HttpUrlConnection request;
    	private DespensaDbAdapter asyncDbHelper;
    	private String device_id;
    	private AccountManager am;
    	private Account[] accounts;
    	private String user_id;
    	private URL url;
    	private final String strurl = "http://alkala.no-ip.org/idespensa_service/idespensa_service.php";
    	
    	public WebServiceComms (Context c){
    		mCtx = c;
    		request = new HttpUrlConnection();
    		asyncDbHelper = new DespensaDbAdapter(mCtx);
    		asyncDbHelper.open();
    		device_id = Secure.getString(c.getContentResolver(), Secure.ANDROID_ID);
    		am = AccountManager.get(mCtx); // "this" references the current Context
            accounts = am.getAccountsByType("com.google");

    		user_id = accounts[0].name;
    		
    		try{
    			url = new URL(strurl);
    		}catch (Exception e){
    			Log.d("url_creacion","URL de sitio remoto mal formada " + e.getMessage());
    		}
    		Log.i("webservice_init","El Id del dispositivo es: " + device_id);
    		Log.i("webservice_init","El id del usuario es: " + user_id);
    	}
    	
    	private void sincronizaNuevoTipo (String nombre){
    		try{
    			String data;
    			JSONObject datos = new JSONObject();
    			datos.put("tipo_producto_nombre", nombre);
    			data = "accion=" + URLEncoder.encode("nuevo_tipo_producto","UTF-8")+
    					"&nombre="+URLEncoder.encode(user_id,"UTF-8")+
    					"&datos="+URLEncoder.encode(datos.toString() );
    			result=request.sendPost(url, data);
    		}catch (Exception e){
    			Log.d("webservice_add_tipo","Error actualizando la BBDD remota: " + e.getMessage());
    		}
    	}
    	    	    	    	
    	@Override
    	protected String doInBackground(String... params) {
    		Log.d("webservice","Entra en asynctask");
    		sincronizaNuevoTipo(params[0]);
    		
    		return null;
    	}

    	@Override
    	protected void onPostExecute(String results) {
    		// TODO Auto-generated method stub
    		super.onPostExecute(result);
    		//parse json data
    		try{
    				JSONObject json_result = new JSONObject(result);
    				Log.d("json_parsing","Numero de elementos en JSON: " + json_result.length());
    				Iterator<?> iter = json_result.keys();
    				while(iter.hasNext()){
				        String key = (String)iter.next();
				        if(key.equals("error")){
				        	Toast.makeText(mCtx, "Error: " + json_result.getString(key), Toast.LENGTH_SHORT).show();
				        }else{
				        	Toast.makeText(mCtx, "Actualizado remoto con id: " + json_result.getString(key), Toast.LENGTH_SHORT).show();
				        	if(mRowId != json_result.getLong(key)){				        		
				        		if(mDbHelper.corrigeId(mRowId,json_result.getLong(key),DespensaDbAdapter.TIPO_PRODUCTO_TABLE)){
				        			mDbHelper.fin_transaccion(true);
				        		}else{
				        			mDbHelper.fin_transaccion(false);
				        		}
				        		mRowId = json_result.getLong(key);
				        	}
				        }				        
				    }
    		        
    		}catch(JSONException e){
    		        Log.e("json_parsing", "Error parsing data "+e.toString());
    		}
    	}

    }
	
	
	public void guardaNuevoTipoProducto(View v) {
		String nombre = nombreNuevoTipoProducto.getText().toString();
		int result = 0;
		if (nombre.length() > 0){
			result = RESULT_OK;
		}else{
			Log.d("nuevo tipo producto","Nombre tipo producto vacio");
			Toast.makeText(this, "El nombre del tipo de producto esta vacio", Toast.LENGTH_LONG).show();
			result = RESULT_CANCELED;
		}
		if (result == RESULT_OK) {
			mDbHelper.inicia_transaccion();
			long id = mDbHelper.nuevoTipoProducto("",nombre);			
			if (id > 0) { 
				mRowId = id;
				webservice.execute(nombre);				
				Log.d("nuevo tipo producto","Tipo de producto insertado con id: " + Long.toString(id));
				Toast.makeText(this, "Tipo de producto insertado con id: " + mRowId.toString(), Toast.LENGTH_SHORT).show();
			}else{
				result = RESULT_CANCELED;
				Log.d("nuevo tipo producto","Producto ya existe");
				Toast.makeText(this, "Este tipo de productos ya existe en BBDD", Toast.LENGTH_SHORT).show();
			}
		} 
		setResult(result);
		finish();
	}
	
	public void setRowId (long id){
		mRowId = id;
	}
	
	
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putLong(DespensaDbAdapter.KEY_PR_ROWID, mRowId);
	}
    
}
